#include "options.h"

/** Zobrazi na displeji dany text.
 * \param text informace o aktualnim prubehu algoritmu
 */
void Options::Display(const std::string & text) {
	if (display) {
		std::string backspace(displayed_len, (char)8);
		std::cout << backspace + std::string(displayed_len, ' ') + backspace + text;
		displayed_len = text.length();
	}
	else if (displayer_available && displayer) {
		displayer->DisplayText(text);
	}
}

/** Vytvori novy displej (stary zustane na obrazovce a jiz nepujde smazat).
 */
void Options::NewDisplay() {
	displayed_len = 0;
}

/** Vytvoreni displeje pro novy test.
 * \param ok pokud je true, tak se na displeji odradkuje
 */
void Options::NextTest(bool ok) {
	if (display) {
		if (ok) {
			NewDisplay();
			Display("\n * ");
			NewDisplay();
		}
	}
	else if (displayer_available && displayer) {
		displayer->NextTest();
	}
}

/** Zobrazi na displeji pocet spoustenych testu.
 * \param count pocet testu
 */
void Options::TestCount(int count) {
	if (display) {
		Display("Total algorithms to start: " + IntToStr(count) + "\n");
		NewDisplay();
	}
	else if (displayer_available && displayer) {
		displayer->TestCount(count);
	}
}

/** Nastavi zobrazovaci objekt. Vyuziti v GUI nebo pokud by nekdo chtel zobrazovat informace v jine podobe.
 * \param displayer zobrazovaci objekt
 */
void Options::SetDisplayObject(ProgressDisplayer * displayer) {
	displayer_available = true;
	this->displayer = displayer;
}

/** Nastavi dostupnost displeje. Displej je nedostupny, pokud se vypis algoritmu provadi na standardni vystup.
 * \param available dostupnost displeje
 */
void Options::SetDisplayAvailability(bool available) {
	display = available && !displayer_available;
}

/** Vypise do logu nastaveni.
 */
void Options::Print() {
	Log() << "Hlavni trida pro nastaveni." << std::endl;
}

/** Virtualni funkce nacitajici nastaveni. Prazdne telo.
 * \param settings XML element s nastavenim aktualniho prvku (mapy nebo algoritmu)
 */
void Options::Read(ticpp::Element * settings) {}
